﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Entidades.Enums;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    public partial class AdministraUsuario : PageBase
    {
        /// <summary>
        /// Clase de negocio de las operaciones de usuarios.
        /// </summary>
        private AdministrarUsuariosNegocio administrarUsuariosNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// Id del proyecto 
        /// </summary>
        private int? IdUsuario
        {
            get
            {
                if (this.ViewState[AppQueryStrings.IdUsuario] == null)
                {
                    this.ViewState[AppQueryStrings.IdUsuario] = "0";
                }

                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdUsuario]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdUsuario] = value;
            }
        }

        /// <summary>
        /// Estatus del usuario
        /// </summary>
        private string EstatusUsuario
        {
            get
            {
                return this.ViewState["EstatusUsuario"].ToString() ;
            }

            set
            {
                this.ViewState["EstatusUsuario"] = value;
            }
        }

        /// <summary>
        /// registros busqueda
        /// </summary>
        private List<UsuarioInfo> DataSourceUsuarios
        {
            get
            {
                if (this.ViewState["DataSourceUsuarios"] == null)
                {
                    this.ViewState["DataSourceUsuarios"] = new List<UsuarioInfo>();
                }

                return this.ViewState["DataSourceUsuarios"] as List<UsuarioInfo>;
            }

            set
            {
                this.ViewState["DataSourceUsuarios"] = value;
            }
        }

        /// <summary>
        /// Inicializa una nueva instancia <see cref="AdministrarProyectosNegocio"/>
        /// </summary>
        public AdministraUsuario()
        {
            this.administrarUsuariosNegocio = new AdministrarUsuariosNegocio();
            this.comunesNegocio = new ComunesNegocio();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdUsuarios.PageSize= Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            if (!IsPostBack)
            {
                this.GetEstatusUsuarios();
                this.Search();

                var permiso = AppSessionManager.Instance.Permisos.Where(p => p.Url == AppUrls.AltaUsuario).SingleOrDefault();

                if (permiso == null)
                {
                    this.btnNuevo.Enabled = false;
                }
            }
        }

        /// <summary>
        /// realiza la busqueda en la base de datos
        /// </summary>
        private void Search()
        {
            var idEstatus = int.Parse(this.ddlEstatus.SelectedValue);
            var estatus = (this.ddlEstatus.SelectedValue == this.comunesNegocio.ValorTodos)
                                ? (bool?) null
                                : (idEstatus == (int) Estatus.Activo);                

            var loUsuario = new UsuarioInfo
                {
                    EstaActivo = estatus,
                    NombreUsuario = String.IsNullOrEmpty(this.txtNombre.Text) ? null : this.txtNombre.Text,
                    ApellidoMaterno = String.IsNullOrEmpty(this.txtApellidoMaterno.Text) ? null : this.txtApellidoMaterno.Text,
                    ApellidoPaterno = String.IsNullOrEmpty(this.txtApellidoPaterno.Text) ? null : this.txtApellidoPaterno.Text,
                    AliasUsuario = String.IsNullOrEmpty(this.txtUsuarioAD.Text) ? null : this.txtUsuarioAD.Text,

                };

            this.DataSourceUsuarios = this.administrarUsuariosNegocio.GetSingleUsuarios(loUsuario);
            this.grdUsuarios.DataSource = DataSourceUsuarios;
            this.grdUsuarios.DataBind();

            this.CleanSeleccion();
        }

        /// <summary>
        /// Obtiene los estatus de los usuarios
        /// </summary>
        private void GetEstatusUsuarios()
        {
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlEstatus);            
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(AppUrls.AltaUsuario);
            this.CleanSeleccion();
        }

        /// <summary>
        /// limpia la seleccion del usuario
        /// </summary>
        private void CleanSeleccion()
        {
            grdUsuarios.SelectedIndex = -1;
            this.IdUsuario = null;
            this.EstatusUsuario = null;
        }

        protected void btnCambiaEstatus_Click(object sender, EventArgs e)
        {
            if (!this.IdUsuario.HasValue || this.IdUsuario == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            var activo = Enum.GetName(typeof(Estatus), Estatus.Activo).ToLower();
            this.administrarUsuariosNegocio.ChangeEstatusUsuario(this.IdUsuario.Value, this.EstatusUsuario != activo);
            this.CleanSeleccion();
            this.Search();
        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(AppUrls.Default);
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        protected void grdUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            var dataKey = grdUsuarios.DataKeys[((GridView)sender).SelectedIndex];
            this.EstatusUsuario = grdUsuarios.Rows[((GridView)sender).SelectedIndex].Cells[5].Text.ToLower();
            if (dataKey == null) return;

            this.IdUsuario = Convert.ToInt32(dataKey.Values[0]);
        }

        protected void grdUsuarios_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdUsuarios.PageIndex = e.NewPageIndex;
            this.grdUsuarios.DataSource = DataSourceUsuarios;
            this.grdUsuarios.DataBind();
        }
    }
}